//
//  main.c
//  C语言总结
//
//  Created by ws on 2017/7/28.
//  Copyright © 2017年 王松. All rights reserved.
//

#include <stdio.h>
/*
 1:C语言基本常识
 1:C语言由函数组成
 2:main是程序的入口
 3:C中不能出现中文或中文字符（注释和字符串中除外）
 关键字:C语言提供表示特殊含义的单词
         特点:1、全部小写 2:在Xcode的紫褐色
 标识符:程序员自己在代码中为某些东西起名字
       规则:1、字母、数组、下划线组成
           2、严格区分大小写
           3、不能以数字开头
           4、不能与关键字重名
 规范:驼峰标识
 注释:对代码的解释说明,它是程序员看的,它不参与编译
      单行注释 和多行注释
       多行注释可以嵌套单行注释,但多行注释不能嵌套多行注释
 数据:存储时长:静态数据:存储在硬盘上的数据
             动态数据:内存中的数据
 常量:不可改变的量
 变量:可以改变的量
 2、数据类型
   1、基本数据类型
      int   4字节  %d %i
      float 4字节  %f
       double 8字节  %lf
       char  1字节  %c
      枚举:枚举本质是整形（enum）
      场合:当某个东西只有几个固定取值的时候
       特点:先定义枚举类型，根据枚举类型定义枚举变量
   2、构造类型
     数组:用来存储相同数据类型的多个数据的集合
         定义:数据类型 数组名称[元素个数]
         遍历:就把所有元素都拿出来看一下（循环）
     结构体:多个数据放在一起可以表示特定含义我们就把它们组成结构体
           特点:先定义结构体类型，然后定义结构体变量(struct)
           结构体与函数就如同基本数据类型与函数的关系
   3、指针:指针就是地址
         指针变量:用来存储地址变量
          1、指针只有初始化才可以访问它所指向存储空间
          2、如果一个指针没有初始化它里面是垃圾值,野指针
           3、指针不能直接赋值一个整形数
         基本数据类型的指针:指向基本数据类型的指针
         格式: 数据类型 * 指针变量名称;
         结构体的指针:指向结构体的类型的指针
         格式  结构体类型 * 指针变量名称
         访问其所指向的结构体成员方式
         (*指针变量名称).成员名称
         指针变量名称->成员名称
 
 数组指针:指向数组的指针
 格式: 所指向的数组的数据类型 (*指针变量名称)[所指向的数组的元素个数];
 这种指针与二维数组名是等价的
 函数指针:指向函数的指针
 格式:所指向的函数的返回值类型 (*指针变量名称)(所指向的函数的形参列表)
 通过函数指针调用函数
 (*指针变量名称)(实参列表)
 指针变量名称(实参列表)
 4、运算符
 1、算术运算符
 + - * / %
 2、赋值运算
 = += -= *= /= %=
 3、自增自减
 ++a,a++
 --a,a--
 4、sizeof运算符:用来计算变量、常量、数据类型所占用存储空间的字节数
 sizeof(常量)  sizeof 常量
 sizeof(变量)  sizeof 变量
 sizeof(数据类型)
 5、逗号运算符
 1、运算顺序是从左到右
 2、逗号表达式的运算结果为最后一个表达式的值
 6、关系运算
 == != > < >= <=
 7、逻辑运算符
 && || !
 8、三目运算
 条件表达式 ? 结果1 : 结果2
 优先级:一般优先级越高越先进行计算
 结合方向:当优先级相同时，计算方向(从左往右，从右往左)
 流程控制:控制程序的执行流程
 顺序结构:按照从上到下的顺序执行
 分支结构:分支结构就相当于岔路口,当条件满足的时候就执行某段代码
 if语句:
 1、if必须以if开头
 2、if可以有多个else if
 3、if语句最多有一个else
 4、if语句中最多只有一个代码块会被执行
 5、如果有else那么必然有一个代码块会被执行
 switch语句：当变量与某个常量相等的时候,就执行这个常量所对应的代码块中的语句
 格式：
 switch(变量){
 case 常量:
 ....
 break;
 case 常量:
 ....
 break;
 ....
 default:
 ...
 break;
 }
 注意点：1、仅支持整型数
 2、case 后面只能常量或常量表达式
 3、case 后面的常量的值不能相同
 4、结束条件 遇到break 或者 运行 ”}“
 
 循环结构:当条件满足就会一直循环执行循环体中的代码,直到条件不再满足位置
 while 语句：当条件满足的时候就执行while后面大括号中语句
 do while:循环体中代码至少执行一次
 for语句
 for(初始化表达式;条件表达式;循环后操作表达式){
 语句;
 ...
 }
 break:1、用在switch语句中用来结束switch语句
 2、用在循环结构中，用结束当前的循环的语句
 continue
 1、只能用在循环结构中，跳过本次循环体中continue后面的语句，进入下一个条件判断
 函数：完成特定功能代码段
 定义格式：返回值类型 函数名称(形参列表){
 语句;
 ....
 }
 函数声明：告诉编译器该函数已经存在了
 函数的声明可以有多个，函数定义只能有一个
 函数参数：
 1、基本数据类型作为函数参数传递是值传递
 2、数组作为函数参数传递是地址传递
 3、指针作为函数参数传递是地址传递
 4、结构体作为函数参数传递与基本数据类型一致
 
 函数返回值:函数完成功能后要返回给主调函数中的数据
 1、返回值的类型必须与返回的值的类型一致
 2、一个函数只能有一个返回值
 return 作用:返回值给主调函数
 结束函数
 预处理指令:在编译之前需要进行解析处理的指令
 1、宏定义:
 不带参数的宏定义:在编译之前,使用宏名的后面值,替换代码中所有出现宏名标识的地方
 带参数的宏定义:把参数代入宏名后面的表达式中,然后替换宏调用的地方
 2、条件编译:在编译的时候,当条件满足的时候就编译某段代码
 #if开头  #elif  #else  #endif结尾
 #ifdef  #endif
 #ifndef #endif
 3、文件包含：
 #include 拷贝所包含的文件内容到#include指令所在地方
 #include " " 包含自己写文件
 #include < > 包含系统的头文件
 
 进制：
 十进制
 二进制  0b 或 0B
 八进制  0         %o 或 %O
 十六进制  0x 或0X  %x 或 %X
 位运算
 &  |  ^  ~  >>  <<
 
 */

int main(int argc, const char * argv[]) {
    struct _PhoneBook{
        char *name;
        char *phone;
    }PhoneBook;
    
    struct   _PhoneBook phonebook[5];
    for (int i=0; i<5; i++) {
        printf("请输入第%d个人的姓名：\n",i+1);
        scanf("%s\n",phonebook[i].name);
        printf("请输入第%d个人的电话：\n",i+1);
        scanf("%s\n",phonebook[i].phone);
    }
    
    for (int i=0; i<5; i++) {
        printf("姓名：%s，电话：%s\n",phonebook[i].name,phonebook[i].name);
    }

    return 0;
}
